# -*- coding: utf-8 -*-
# @Time    : 2019/10/26 21:52
# @Author  : LiHaowen
# @Email   : lihaowen2017@163.com
# @File    : multiprocessing_test.py

# import os
# import time
# # fork只能用于linux/unix中
# pid = os.fork()  # 新建子进程
# # 子进程将父进程的数据拷贝
# # 子进程中将fork后的代码重新运行
# print("b1")  #
# if pid == 0:  # pid为0是子进程，pid为数值是主进程
#     print(f"子进程是：{os.getpid()},父进程是：{os.getppid()}.")
# else:
#     print(f'我是父进程：{pid}')
# # 如果没有sleep则父进程运行完直接退出，此时子进程无法退出
# # 增加sleep，当子进程结束后父进程未退出，父进程结束后，子进程会被kill掉
# time.sleep(2)
# '''
# b1
# 我是父进程： 24474
# b1
# 子进程：24474， 父进程是24473
# '''

from concurrent.futures import ProcessPoolExecutor
import multiprocessing
# 多进程编程
import time


def get_html(n):
    time.sleep(n)
    print("sub_progress success")
    return n


if __name__ == '__main__':
    # progress = multiprocessing.Process(target=get_html, args=(2,))
    # print(progress.pid)
    # progress.start()
    # print(progress.pid)  # 进程id
    # progress.join()
    # print("main progress end")

    # 使用进程池
    pool = multiprocessing.Pool(multiprocessing.cpu_count())  # 进程数等于cpu数
    # result = pool.apply_async(get_html, args=(3,))
    # # 等待所有任务完成
    # pool.close()
    # pool.join()  # 使用join之前必须要close让pool不再接收新任务
    # print(result.get())   # 获得任务的返回值

    # imap 同线程池中的map方法一致，返回值顺序与传入顺序一致
    # for result in pool.imap(get_html, [1, 5, 3]):
    #     print(f"{result} sleep success")
    # imap_unordered 谁先完成打印谁的结果
    for result in pool.imap_unordered(get_html, [1, 5, 3]):
        print(f"{result} sleep success")
